define([
    'Util',
    '../common/getMenu',
    'list',
    'form',
    'text!tpl/sprint/sprintList.tpl',
    '../common/getProjectList',
    'cookie',
    'dialog',
    'select',
    'tab',
    'loading',
    '../common/getPath',
    'date',
    '../common/dateFormat'
], function(Util, getMenu, List, Form, tpl, getProjectList, $cookie, Dialog, Select, Tab, Loading, AjaxPath, MyDate) {
    require(['style!css/style.css']);
    var $el=null;
    var _indexModule = null,
        list = null,
        tab = null,
        tplId = null,
        handLoading = null,
        Authority = null;

        var initialize = function(indexModule, options, tabItem){
            $el = $(tpl);
            _indexModule = indexModule;
    
            tab = tabItem;
            createLoading();
            this.content=$el;
            tplId = options.menuId;
    
            // 业务相关代码
            eventInit();
             inSelect();
             initDate();
            getAuthority($el); 
            getMenu(tab, options.menuId);   
        };

        var eventInit = function (){
            //页面除dialog按钮功能
            $el.on('click', '#btnAdd', addProject);
            $el.on('click', '#btnDel', delProject);

            $el.on('click', '.btnSearch', search);
            $el.on('click', '.btnReset', searchRest);
            $el.on('click', '.statusBtn', statusProject);
            $el.on('click', '.deleteBtn', delProject);
            $el.on('click', '.editBtn', editProject); 
            // $el.on('click', '.flowActions>button', editFlowActions);     
            $('#tabList li.' + tplId).on('click', tabActive);
            
            // $(document).on('click', '#projectActiveLogWrap .t-list li>a', actLogChange);
        };
        var tabActive = function() {
            // listInit();
            var pageIndex=list.pageIndex;
            search(pageIndex);
            getMenu(tab, tplId);     
        };

        var search = function(pageIndex) {
            var data = Form.serialize($('.sprintProjectForm', $el));
            data.limit = 10;
            data.page = 1;

            data.systemId = $cookie.get("projectSelectId");
            if(data.systemId===null||data.systemId===undefined){
                data.systemId='';
            };
            
            var page=pageIndex;  
                list.search(data,Number(page));
                $(".sprintListContainer").find("a").removeClass("theSort");       
        } 
        var searchRest = function(){
            $("input[name=sprintName]",$el).val("");
            $("input[name=userName]",$el).val("");
            $("input[name=startTime]",$el).val("");
            $("input[name=endTime]",$el).val("");
            $("input[name=createTime]",$el).val("");
            statusSelect.setValue(0);
            var data={};
            data.systemId = $cookie.get("projectSelectId");
            if(data.systemId===null||data.systemId===undefined){
                data.systemId='';
            };
            list.search(data);
            $(".sprintListContainer").find("a").removeClass("theSort");
        }      

        var createLoading = function() {
            loadingConfig = {
                el: 'body', //组件要绑定的容器，默认为body（此项可不配置或留空）
                className: 'loading', //组件外围的className
                position: 'center', //提示信息位置，顶部top|默认center中央
                width: '300', //loading的宽度,非必须，默认300
                height: 'auto', //loading的宽度,非必须，默认auto
                mask: 1, //是否显示遮罩， 0不显示|默认1显示
                animate: 1, //是否显示动画效果， 0不显示|默认1显示
                mode: 'layer', //展示方式 loadingLine线条方式|默认layer弹层方式
                text: '加载中...', //提示文字，默认 加载中...
                icon: 'dotCycle', //文字前面的gif动画， 默认dotCycle有点组成的圈|cmcc移动图标|cmccLarge大的移动图标
            }
        };

    //下拉框select组件；
    var inSelect = function() {      
     //状态，status;
         Util.ajax.getJson( AjaxPath.project + "/dropdown?modual=sprint&type=sprintStatus", {}, function(result, isok){
             statusSelect = new Select({
                 el:$("#statusName", $el),       //要绑定的容器
                 ajax:{    //所有jquery.ajax的配置项均可配置，这些配置将替换底层组件的配置，<span class="s">慎用</span>
                     method:'GET'
                 }, 
                 label:'状态:', //下拉框单元左侧label文本，可不配置
                 selectText:false,       //是否显示  ‘选择|清除’  模式
                 name:'status',    //下拉框单元右侧下拉框名称
                 disabled:false,     //组件是否被禁用
                 topOption:"请选择", //设置最顶部option的text属性
                 value:'',//初始选中项设置 默认是按value，如果你想按id设置 也可以 value:[&quot;id&quot;,1],这样设置
                 textField:"value",   //设置下拉框内容，填写数据中对应的字段名
                 valueField:"key",//设置下拉框value，填写数据中对应的字段名
                 datas: result.beans,         //数据源
                 loadAtClick:false,// true--第一次点击时渲染|false或不配置--初始化时渲染
                 dataReady:function(){
                     console.log("获取状态");
                 } //select的DOM结构加载完后执行
                 //  url:'../data/select.json'  //数据源，不建议使用，后期将会移除
             });
             // $("#projectManage .sn-select-container").addClass("mt-5");
             // $("#projectExcuter", $el).find('a.sn-select-single>span').html("所有");
             statusSelect.setValue(0);
         });
     };

     var initDate = function() {
        needDate = new MyDate({
            el:$("#startTime", $el),
            inputClassName:'date',
            label:'开始时间:',
            name:'startTime',    //开始日期文本框name
            isReadOnly:true,  //项可设置日期输入框是否只读
            min: -365,         //最小日期限制
            range:true,
            type:"date",
            inputPlaceholder:"请选择",
            // defaultValue:"2017-09-20 - 2017-10-24",
            defaultValue:"",
            btns:['clear', 'now', 'confirm'],
            done:function(dates,value,endDate){
                // createTimeDate.options.min = dates; //设置创建日期的最小限制
                // editorTimeDate.options.min = dates; //设置结束日期的最小限制
            } //用户选中日期时执行的回调函数
        });

        editorTimeDate = new MyDate({
            el:$("#endTime", $el),
            inputClassName:'date',
            label:'结束时间:',
            name:'endTime',    //开始日期文本框name
            isReadOnly:true,  //项可设置日期输入框是否只读
            min: -365,         //最小日期限制
            range:true,
            type:"date",
            inputPlaceholder:"请选择",
            // defaultValue:"2017-09-20 - 2017-10-24",
            defaultValue:"",
            btns:['clear', 'now', 'confirm'],
            done:function(dates,value,endDate){
                console.log(dates)
            } //用户选中日期时执行的回调函数
        });

        createTimeDate = new MyDate({
            el:$("#createTime", $el),
            inputClassName:'date',
            label:'创建时间:',
            name:'createTime',    //开始日期文本框name
            isReadOnly:true,  //项可设置日期输入框是否只读
            min: -365,         //最小日期限制
            range:true,
            type:"date",
            inputPlaceholder:"请选择",
            // defaultValue:"2017-09-20 - 2017-10-24",
            defaultValue:"",
            btns:['clear', 'now', 'confirm'],
            done: function(dates,value,startDate){
                // editorTimeDate.options.min = dates; //设置结束日期的最小限制
            }
        });
    }

        //可拖动top顶栏；
    var inProjectList = function(){
        getProjectList($cookie.get("userId"), listInit, search); //第一个参数为用户id
    }   

        //验证权限
    var getAuthority = function($el) {
        Util.ajax.getJson(AjaxPath.auth + '/authority/button/'+ $cookie.get("userId") +'?datas=[{"mo":"26","btnId":""}]', {}, function(result, json){
            if(result.returnCode==="0000"){
                if(result.beans[0].mo===0){
                    Authority = false;
                }else {
                    Authority = true;
                }
                inProjectList();
            }
        });
        require(['js/btnAuthority'], function(Authority){
            new Authority($el);
        }); 
    }
    

    var listInit = function (){
        var config = {
            el: $('.sprintListContainer', $el),
            ajax:{    //所有jquery.ajax的配置项均可配置，这些配置将替换底层组件的配置；慎用
                method:'GET'
            },
            field: {
                boxType: 'checkbox',
                key: 'id',
                items: [
                {
                    text: '迭代名称',
                    title: 'sprintName',
                    name: 'sprintName',
                    className: 'w90',
                    sorting:1,
                    width:200,
                    click: function (e, val, item) {

                        handLoading = new Loading(loadingConfig);
                        creatDialog(e, item);
                        handLoading.destroy();
                    },
                    render: function (item, val) {
                        val = $('<span/>').text( val ).html();
                        val = val.replace(/\s/g, '&nbsp;');
                        return '<a href="javascript:;" class="text-overflow text-pre" style="line-height:36px;display:block;outline:none">' + val + '</a>';
                    }
                },
                {
                    text: '周期',
                    title: '',
                    name: '',
                    className: 'w90',
                    width:200,
                    click: function (e, val,item) {                      
                    },
                    render: function (item, val) {
                        return '<span>'+item.cycleNum+item.cycleDate+'</span>'
                    }
                },
                {
                    text: '开始时间',
                    // title: 'proposeTime',
                    name: 'startTime',
                    className: 'w90',
                    sorting: 1,
                    width: 150,
                    render: function (item, val) {
                        if(val){
                            return new Date(val).Format("yyyy-MM-dd");
                        }                       
                    }
                },
                {
                    text: '结束时间',
                    // title: 'createTime',
                    name: 'endTime',
                    className: 'w90',
                    width: 150,
                    sorting:1,
                    render: function (item, val) {
                        if(val){
                           return new Date(val).Format("yyyy-MM-dd"); 
                        }                 
                    }
                },
                {
                    text: '创建人',
                    title: 'userName',
                    name: 'userName',
                    className: 'w120',
                    width:100,
                },
                {
                    text: '状态',
                    // title: 'status',
                    name: 'status',
                    className: 'w120',
                    width:100,
                    sorting:1,
                    render: function (item, val) {
                        if(item.sprintStatus){
                           return item.sprintStatus;
                        }                 
                    }
                },              
                {
                    text: '操作',
                    title: '',
                    name: '',
                    width:'',
                    className: 'w90',
                    click: function (e, val, item) {
                        // console.log(val,item);
                    },
                    render: function (item, val) {
                      var btn='';
                      if(item.status===0){
                          btn="开始"
                      } else if(item.status===1){
                          btn="完成"
                      } else if(item.status===2){
                          btn="已完成"
                      }

                        var defaultButton = "";
                        var statusButton = "";
                        if(Authority){
                            if(item.isDefault===1){
                                return '<div class="fn-center" style="color:#fff"><button style="margin-right:5px;width:56px;background:#808a94" disabled="disabled" class="t-btn t-btn-xs statusBtn"><a style="color:#fff">'+btn+'</a></button><button style="margin-right:5px;background:#808a94" disabled="disabled" class="t-btn t-btn-xs editBtn"><a style="color:#fff">修改</a></button><button style="background:#808a94" disabled="disabled" class="t-btn t-btn-xs deleteBtn"><a style="color:#fff">删除</a></button></div>';
                            } else {
                                if(item.status===1){
                                    defaultButton = '<button style="margin-right:5px;" class="t-btn t-btn-blue t-btn-xs editBtn"><a style="color:#fff">修改</a></button><button style="background:#808a94" disabled="disabled" class="t-btn t-btn-xs deleteBtn"><a style="color:#fff">删除</a></button>'; 
                                }else {
                                    defaultButton = '<button style="margin-right:5px;" class="t-btn t-btn-blue t-btn-xs editBtn"><a style="color:#fff">修改</a></button><button class="t-btn t-btn-blue t-btn-xs deleteBtn"><a style="color:#fff">删除</a></button>';
                                }
                                
                                if(item.status===2){
                                   statusButton='<button style="margin-right:5px;width:56px;background:#808a94" disabled="disabled" class="t-btn t-btn-xs statusBtn"><a style="color:#fff">'+btn+'</a></button>'
                                }else{
                                    statusButton='<button style="margin-right:5px;width:56px" class="t-btn t-btn-blue t-btn-xs statusBtn"><a style="color:#fff">'+btn+'</a></button>'
                                }
                                return '<div class="fn-center" style="color:#fff">'+statusButton+defaultButton+'</div>';
                            }
                            
                        } else{
                            return '<div class="fn-center">您没有权限操作该项!</div>'
                        }

                        
                    }
                }]
            },
            page: {
                customPages: [2, 3, 5, 6, 10, 15, 20, 30, 50], //可选择每页显示多少条
                perPage: 10, //默认每页显示多少条记录
                total: true
            },
            data: {
                url: AjaxPath.project + "/sprints?"
                // url:"http://192.168.91.172:8089/devops-project/projects"
                // url:"../../../data/needSelect.json"
            }
        };
        list = new List(config);
        var data={};
        data.systemId = $cookie.get("projectSelectId");
        if(data.systemId===null||data.systemId===undefined){
            data.systemId='';
        };
        list.search(data);
    }

    //点击新增；
    var addProject = function(e) {
        tab.createTab({
            title: '新建迭代',
            closeable: 1, //是否可以关闭 0false不可以|1true可以
            className: 'addSprintTab'
        });
        tab.switchTab('新建迭代');
        var projectdata = {};
        projectdata.menuId = tplId;
        require(['js/sprint/addSprint'], function(addProjectContent) {
            var result = new addProjectContent({}, projectdata, tab);
            tab.content(result.content);
        });
        
    }

    //两个按钮删除功能
    var delProject = function(e){
        
        if(e.currentTarget.id!=="btnDel"){
            $(".sprintListContainer .sn-list-content-locker.sn-list-show table tbody tr.selected td",$el).click();
            $(".sprintListContainer .sn-list-show table tbody tr",$el).eq(e.currentTarget.parentNode.parentNode.parentNode.rowIndex).find('td').click();
        }

        handLoading = new Loading(loadingConfig);
        var nodes = list.getCheckedRows();
        if(nodes.length < 1) {
            handLoading.destroy();
            config = {
                mode: 'tips',
                content: '<div style="text-align:center;margin-top:70px">请选择至少一条数据进行删除！</div>',
                width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                height: 150, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                cancelDisplay: false
            };
            var dialog = new Dialog(config);
        } else {
            var data = [];
            for(var i = 0; i < nodes.length; i++) {
                if(nodes[i].status!=1&&nodes[i].isDefault!=1){
                    data.push(list.getCheckedRows()[i].id);
                }   
            }
           
            var str = JSON.stringify(data);
            delDialogBox(nodes, data, str);
        }    
    }
    var delDialogBox = function(nodes, data, str) {
        handLoading.destroy();
        var config = {
            mode: 'confirm', //对话框模式，默认normal标准|tips浮动层|confirm确认对话框
            title: "删除提示", //对话框标题
            content: '<div style="text-align:center;margin-top:50px">确认删除选择的迭代？</div>' /* + content.substring(0,content.length-1)*/ , //对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
            ok: function() {
                handLoading = new Loading(loadingConfig);
                deleteProject(nodes, data, str);
                return true;
            }, // 配置该项时才会出现ok按钮，回调函数可为空。如果指定 return false 则执行完方法后不关闭对话框。默认 return true
            okValue: '确定', //确定按钮的文本 默认是 ‘ok’
            cancel: function() {}, //取消按钮的回调函数,配置该项时才会出现关闭按钮，回调函数可为空。
            cancelValue: '取消', //取消按钮的文本 默认是 ‘关闭’
            cancelDisplay: true, //是否显示取消按钮 默认true显示|false不显示
            width: 300, //对话框宽度，normal默认值为600，confirm默认值为300，tips默认值为240
            height: 120, //对话框高度，normal默认值为400，confirm默认值为180，tips默认值为80
            padding: '0 16px 1em 10px', //(默认值: 继承 css 文件设置) 设置消息内容与消息容器的填充边距，即 style padding属性
            align: 'bottom right', //设置对话框与其他元素的对齐方式。仅在show(elem)与showModal(elem)传入元素时生效。默认值: "bottom left"。可选："top left" "top" "top right" "right top" "right" "right bottom" "bottom right" "bottom" "bottom left" "left bottom" "left" "left top"。
            skin: 'dialogSkin dialogSkin2', //设置对话框额外的className参数,多个className请使用空格隔开。
            fixed: true, //是否开启固定定位 默认false不开启|true开启
            quickClose: false, //点击空白处快速关闭 默认false不关闭|true关闭
            modal: true, //是否开启模态框状态  默认false不开启|true开启,confirm默认状态为true
            beforeOpen: function() {}, //对话框打开之前执行。
            zIndex: 990 // 对话框的z-index值，默认是1024。
        };
        var delDialog = new Dialog(config)
    };

    var deleteProject = function(nodes, data, str) {
        if(nodes.length===1){
            if(nodes[0].status===1){
                handLoading.destroy();
                new Dialog({
                    mode: 'tips',
                    content: '<div style="text-align:center;margin-top:70px">所选迭代'+nodes[0].sprintName+'，状态为“进行中”不可删除</div>',
                    width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                    height: 150, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                    cancelDisplay: false
                }); 
            } else {
            Util.ajax.getJson(AjaxPath.project+ "/sprints/delete/"+nodes[0].id, {}, function(result, isok) {
                var flag = result.returnMessage;
                if(undefined === flag) {
                    handLoading.destroy();
                    new Dialog({
                        mode: 'confirm', //对话框模式，默认normal标准|tips浮动层|tips确认对话框
                        title: '提示', //对话框标题
                        width: 300,
                        height: 120,
                        modal: true,
                        content: '<div style="text-align:center;margin-top:50px">与服务器通讯失败，请检查网络！</div>', //对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
                        cancelDisplay: false,
                        ok: function() {}, // 配置该项时才会出现ok按钮，回调函数可为空。如果指定 return false 则执行完方法后不关闭对话框。默认 return true
                        okValue: '关闭' //确定按钮的文本 默认是 ‘ok’
                    });
                    return;
                } else {
                    handLoading.destroy();
                    new Dialog({
                        mode: 'tips',
                        content: '<div style="text-align:center;margin-top:70px">'+ result.returnMessage +'</div>',
                        width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                        height: 150, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                        cancelDisplay: false
                    });
                    if(result.returnCode==="0000"){
                        search();
                    }
                }
            })
        }
        } else {
            Util.ajax.postJson(AjaxPath.project+ "/sprints/batchDelete", str, function(result, isok) {
                var flag = result.returnMessage;
                if(undefined === flag) {
                    handLoading.destroy();
                    new Dialog({
                        mode: 'confirm', //对话框模式，默认normal标准|tips浮动层|tips确认对话框
                        title: '提示', //对话框标题
                        width: 300,
                        height: 120,
                        modal: true,
                        content: '<div style="text-align:center;margin-top:50px">与服务器通讯失败，请检查网络！</div>', //对话框内容，可以是字符串、html片段、或dom对象,默认为loading状态（点组成的圈）
                        cancelDisplay: false,
                        ok: function() {}, // 配置该项时才会出现ok按钮，回调函数可为空。如果指定 return false 则执行完方法后不关闭对话框。默认 return true
                        okValue: '关闭' //确定按钮的文本 默认是 ‘ok’
                    });
                    return;
                } else {
                    handLoading.destroy();
                    new Dialog({
                        mode: 'tips',
                        content: '<div style="text-align:center;margin-top:70px">'+ result.returnMessage +'</div>',
                        width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
                        height: 150, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
                        cancelDisplay: false
                    });
                    if(result.returnCode==="0000"){
                        search();
                    }
                }
            },"application/json")
            }         
    }

    //点击status按钮
    var statusProject=function(e){
        $(".sprintListContainer .sn-list-content-locker.sn-list-show table tbody tr.selected td",$el).click();
        $(".sprintListContainer .sn-list-show table tbody tr",$el).eq(e.currentTarget.parentNode.parentNode.parentNode.rowIndex).find('td').click();
        var datas = list.getCheckedRows();
      
       Util.ajax.postJson(AjaxPath.project+ "/sprints/updateStatus/"+datas[0].id+"/"+datas[0].status, {}, function(result, isok) {
        new Dialog({
            mode: 'tips',
            content: '<div style="text-align:center;margin-top:70px">'+ result.returnMessage +'</div>',
            width: 300, //对话框宽度，可选项。normal默认值为600，confirm默认值为300，tips默认值为240
            height: 150, //对话框高度，可选项。normal默认值为400，confirm默认值为180，tips默认值为80
            cancelDisplay: false
        });
        if(result.returnCode==="0000"){
            search(list.pageIndex);
        }
       },"application/json");
       
    }

    //点击修改；
    var editProject = function(e) {
        $(".sprintListContainer .sn-list-content-locker.sn-list-show table tbody tr.selected td",$el).click();
        $(".sprintListContainer .sn-list-show table tbody tr",$el).eq(e.currentTarget.parentNode.parentNode.parentNode.rowIndex).find('td').click();
        var nodes = list.getCheckedRows();

     tab.createTab({
         title: '修改迭代',
         closeable: 1, //是否可以关闭 0false不可以|1true可以
         className: 'editSprintTab'
     });
     tab.switchTab('修改迭代');
     var projectdata =nodes[0];
     projectdata.menuId = tplId;
     require(['js/sprint/editSprint'], function(addProjectContent) {
         var result = new addProjectContent({}, projectdata, tab);
         tab.content(result.content);
     });  
    }
    
    //点击迭代名称
    var creatDialog =function(e, item){
        item.data.menuId = tplId;
        require(['js/sprint/viewSprint'], function(viewSprint) {
            var resultViewSprint = new viewSprint({}, item.data, tab);
            var config = {
                mode: 'normal', //对话框模式，默认normal标准|tips浮动层|confirm确认对话框
                title: "迭代:"+item.data.sprintName, //对话框标题，
                content: resultViewSprint.content, //对话框内容，可以是字符串、html代码段,tpl对象。默认为loading状态（由点组成的圈。大段代码建议使用 tpl。
                cancelValue: '关闭', //取消按钮的文本 默认是 ‘关闭’
                okValue: '修改', //取消按钮的文本 默认是 ‘关闭’//取消按钮的文本 默认是 ‘关闭’
                cancelDisplay: false, //是否显示取消按钮 默认true显示|false不显示
                width: 1000, //对话框宽度，normal默认值为600，confirm默认值为300，tips默认值为240
                height: 490, //对话框高度，normal默认值为400，confirm默认值为180，tips默认值为80
                maxWidth: 240,//设置tips对话框的最大宽度,默认为240px。仅在tips对话框下生效，该项存在时，width属性将失效。
                maxHeight: 'auto', //设置tips对话框的最大高度,默认为auto。仅在tips对话框下生效，该项存在时，height属性将失效。
                padding:'0 16px 1em 10px',//(默认值: 继承 css 文件设置) 设置消息内容与消息容器的填充边距，即 style padding属性
                align: 'bottom left',//设置对话框与其他元素的对齐方式。仅在show(elem)与showModal(elem)传入元素时生效。默认值: "bottom left"。可选："top left" "top" "top right" "right top" "right" "right bottom" "bottom right" "bottom" "bottom left" "left bottom" "left" "left top"。
                skin: 'dialogSkin dialogSkin2',//设置对话框额外的className参数,多个className请使用空格隔开。
                fixed: false, //是否开启固定定位 默认false不开启|true开启
                quickClose: false, //点击空白处快速关闭 默认false不关闭|true关闭
                modal: true ,//是否开启模态框状态  默认false不开启|true开启,confirm默认状态为true
                backdropBackground:'#000',//设置遮罩颜色，默认 #000。
                backdropOpacity:0.7, //设置遮罩透明度，默认 0.7，取值范围：0~1 。
                beforeOpen: function() {
                    console.log('对话框打开时执行。');

                }, //对话框打开之前执行。
                escClose:true,//esc键快速关闭对话框，默认为true
                zIndex:990   // 对话框的z-index值，默认是1024。
            };
           var dialog= new Dialog(config);
           dialog.on('onclose',function(){
            console.log('弹窗关闭');search(list.pageIndex);
        });
        });       

    }

        return initialize;
})